package com.tabnet.dao.impl;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.HashMap;

import com.tabnet.beans.gammeproduit.PropositionGamme;
import com.tabnet.beans.personnes.Fournisseur;
import com.tabnet.beans.produit.GammeProduit;
import com.tabnet.dao.DAOException;
import com.tabnet.dao.DAOFactory;
import com.tabnet.dao.DAOGammeProduit;
import com.tabnet.dao.DAOPropositionGamme;
import com.tabnet.dao.DAOUtilitaire;

public class PropositionGammeDAOImpl implements DAOPropositionGamme {
	
	private static final String SQL_SELECT_LAST  	= "SELECT Ref_PG FROM PropositionGamme ORDER BY Ref_PG DESC LIMIT 0 , 1";
	private static final String SQL_LISTER  		= "SELECT * FROM PropositionGamme WHERE FournisseurID = ?";
	private static final String SQL_LISTER_TOUT 	= "SELECT * FROM PropositionGamme p, Etat e, GammeProduit g WHERE " +
											"g.Etat_Ref = e.Ref_Etat AND g.Ref_GAM = p.GAM_Ref AND Description_Etat ='Temporaire'";
	private static final String SQL_INSERT		  	= "INSERT INTO PropositionGamme VALUES (?,?,?,?)";

	private DAOFactory daoFactory;
	private static DAOGammeProduit daoGammeP;
	
	public PropositionGammeDAOImpl( DAOFactory daoFactory ) {
        this.daoFactory = daoFactory;
        daoGammeP = daoFactory.getGammeProduitDAO();
    }
	
	@Override
	public void addPropositionGamme(PropositionGamme propoGamme) throws DAOException {
		Connection connexion = null;
        PreparedStatement preparedStatementP = null;
        ResultSet valeursAutoGenerees = null;
        
        try {
            connexion = daoFactory.getConnection();
            
          //Récupération du dernier numéro
            String strNewRef;
        	String strLastRef = this.getLastRef();
        	if(strLastRef == null)
        		strNewRef = "PG_0000001";
        	else if(strLastRef.length() == 10){
        		//Incrementation de cette derniere reference
        		String num = (Integer.parseInt(strLastRef.substring(5)) + 1) + ""; 
        		
        		while(num.length() < 7)
        			num = "0" + num;
        		
        		strNewRef = "PG_" + num;
        	}
        	else{
                throw new DAOException( "Échec de la récupération de la dernière référence." );
        	}
        	
        	propoGamme.setRef(strNewRef);
        	
            daoGammeP.addGammeProduit(propoGamme.getGammeProposer());
            
            // insertion
	        preparedStatementP = DAOUtilitaire.initialisationRequetePreparee( connexion, SQL_INSERT, true,
	        		propoGamme.getRef(), propoGamme.getDescription(), propoGamme.get_fournisseur().get_IdF(), 
	        		propoGamme.getGammeProposer().getRef());
            int statut = preparedStatementP.executeUpdate();
            if ( statut == 0 ) {
                throw new DAOException( "Échec de la création de la proposition, aucune ligne ajoutée dans la table." );
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
        	 DAOUtilitaire.fermeturesSilencieuses( valeursAutoGenerees, preparedStatementP, connexion );
        }
	}

	@Override
	public void updPropositionGamme(PropositionGamme propoGamme, String action) throws DAOException {
		daoGammeP.updGammeProduit(propoGamme.getGammeProposer(), action);
	}

	@Override
	public PropositionGamme trouverPropositionGamme(String ref) throws DAOException {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public HashMap<String, PropositionGamme> listerPropositions(Fournisseur fourn) throws DAOException {
		Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        HashMap<String, PropositionGamme> lesPropos = new HashMap<String, PropositionGamme>();
        PropositionGamme prop;
        try {
            connection = daoFactory.getConnection();
            // récupération des fournissseurs
            preparedStatement = DAOUtilitaire.initialisationRequetePreparee( connection, SQL_LISTER, false,
	        		 fourn.get_IdF());
            resultSet = preparedStatement.executeQuery();
            while ( resultSet.next() ) {
            	prop = map( resultSet );
    			prop.set_fournisseur(fourn);
            	lesPropos.put(prop.getRef(), prop);
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            DAOUtilitaire.fermeturesSilencieuses( resultSet, preparedStatement, connection );
        }
		
		return lesPropos;
	}

	private static PropositionGamme map( ResultSet resultSet ) throws SQLException {
		PropositionGamme prop = new PropositionGamme();
    	
		prop.setRef( resultSet.getString( "Ref_PG" ) );
		prop.setDescription( resultSet.getString( "Description_PG" ) );
    	
		try {
			GammeProduit gammeP = daoGammeP.trouverGammeProduit(resultSet.getString( "GAM_Ref" ), false);
			prop.setGammeProposer(gammeP);
			
		} catch (DAOException e) {
			e.printStackTrace();
		}
    	
        return prop;
    }

	@Override
	public HashMap<String, PropositionGamme> listerPropositions() throws DAOException {
		Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        HashMap<String, PropositionGamme> lesPropos = new HashMap<String, PropositionGamme>();
        PropositionGamme prop;
        try {
            connection = daoFactory.getConnection();
            // récupération des fournissseurs
            preparedStatement = DAOUtilitaire.initialisationRequetePreparee( connection, SQL_LISTER_TOUT, false);
            resultSet = preparedStatement.executeQuery();
            while ( resultSet.next() ) {
            	prop = map( resultSet );
            	lesPropos.put(prop.getRef(), prop);
            }
        } catch ( SQLException e ) {
            throw new DAOException( e );
        } finally {
            DAOUtilitaire.fermeturesSilencieuses( resultSet, preparedStatement, connection );
        }
		
		return lesPropos;
	}
	
	public String getLastRef() throws SQLException, DAOException {
		Connection oConnexion = null;
        PreparedStatement oPreparedStatement = null;
        ResultSet resultSet = null;
        
        String strRef = null;

        try {
        	oConnexion = daoFactory.getConnection();
        	
        	oPreparedStatement = DAOUtilitaire.initialisationRequetePreparee( oConnexion, SQL_SELECT_LAST, false);
            resultSet = oPreparedStatement.executeQuery();
            
            if ( resultSet.next() )
            	strRef = resultSet.getString("Ref_PG");
        }
        catch ( SQLException e ) {
            throw new DAOException(e);
        }
        finally {
            DAOUtilitaire.fermeturesSilencieuses( resultSet, oPreparedStatement, oConnexion );
        }

        return strRef;
    }
}
